﻿using System;

namespace DBConsolo
{
    class Program
    {
        static void Main(string[] args)
        {
            //数据库优化
            // 关系引擎（命令解析器、查询分析器、查询执行器）
            //存储引擎（数据访问方法、缓冲区管理器、事务管理器）
            //缓存区（执行计划缓存区、其他缓存-数据缓存区） 缓存区文件来自数据文件

            //客户端 - 协议层 -命令解析器 - 查询分析器 - 缓存区（执行计划缓存区、其他缓存、数据缓存区）-查询分析器-
            //                 查询执行器 - 数据访问方法（申请锁（事务管理器））- 缓冲区管理器 - 缓存区（执行计划缓存区、其他缓存、数据缓存区）-
            //                 -缓冲区管理器 - 数据访问方法 - 查询执行器 - 协议层 - 客户端

            // 8kb/page 任何一条数据都不能跨页存储:数据长度不能超过5096、char heap
            // text储存超过8kb，会存在另外一个page，数据页只存储位置（效率会很低）
            // int/datetime , 可以放入一个page（设计数据库的时候，字段类型空间范围尽量小一点）
            // 8个page ==extent -- heap

            // IAM page 管理数据页，记录好数据页在硬盘的具体位置
            // 文本/图像页 page 

            // 索引页  Index page   索引页：数据&位置  索引是一个独立的，重复的存储，体积小，扫描快

            //换聚集索引，很耗时，很多硬盘操作，
            //聚集索引只有一个，但是可以有多个字段
            //一般是自增主键/创建时间/价格
            // 因为数据物理排序，当然查询快

            //非聚集索引 
            //不影响数据的物理排序，但是重复存储一个数据和位置
            //找数据：先找索引--快速定位--拿到数据
            //查找快，但是有维护索引的成本，不是越多越好
            //非聚集索引，可以多个
            //适合经常查询的字段，名称/账号
            //非聚集索引不能运算 不能 like '%%'，索引条件在前
            
            //索引使用建议
            // 主键是必须建立索引的（推荐数值主键，性能最高）
            //外键列也要索引
            // 经常查询的建立索引
            //经常在where里面
            //order by / group by /distinct
            //聚合运算/where条件时，先索引字段
            
            //聚集索引不使用建议。
            //基不怎么查询的
            //重复值比较多的不要索引
            //text/image 不要索引
            //索引不要太多

            //执行计划：提交sql语句：数据库查询优化器，经过分析生成，制定多个查询方式，从中选择资源最少的

            // table scan  全表扫描 性能最差 
            // ckuster Index Scan 性能最差同上 虽然有聚集索引、其实也是全表扫描
            // Index Seek （NonClusttered） 性能非常差  索引查找
            // index Scan 先index，在扫描
            // cluster index seek 性能非常高

            //常规的sql优化建议
            //对列的计算要避免，任何形式都要避免 
            //in查询，or查询，索引会失效 可能是拆分
            // 查询 in 换 exists  not in 不要用 不走索引
            // join时，链接越少性能越高
            // 左连接 以左边的结果为准。


            //lucene.net ：全文检索的工具包，不是应用，只是个类库，完成了全文检索的功能
            //就是把数据拆分， -- 存起来 -- 查询时 -- 拆分 -- 匹配 -- 结果 
            //Analysis -- 分词器，负责把字符串拆分成原子，包含了标准分词，直接空格拆分
            //    项目中用的是盘古分词
            //Document -- 数据结构，定义存存储数据的格式
            //index -- 索引的读写类
            //queryParser -- 查询解析器，负责解析查询语句
            //search -- 索引存储类，负责文件夹等等
            //utill -- 常见工具类库

            //lucene是全文搜索必备的，是大型系统必备的
            Console.WriteLine("Hello World!");
        }
    }
}
